#ifndef __H__XML__H__
#define __H__XML__H__

#include "../CommDef/typedef.h"
#ifndef	DM642
#include <stdio.h>
#endif	//DM642
#include <string.h>
 
#define		NODENAME_MAX_LENGTH		32
#define		NODEVALUE_MAX_LENGTH	64
 

#ifdef __cplusplus
extern "C"{
#endif

typedef struct xml_t
{
	int32	bUser;  //节点使用情况，主要为了静态分配和遍历
	int8		 FName[NODENAME_MAX_LENGTH];		//节点名称
	int8		 FText[NODEVALUE_MAX_LENGTH];		//节点内容
	struct xml_t * FChild;	//子节点
	struct xml_t * FParent;	//父节点
	struct xml_t * FFriend;	//同级节点
}S_XMLItem;							//XML节点结构

//节点 必须和S_XMLItem中的相关内容对应
//可以考虑两个合并
typedef struct xml_node
{
	int8		 name[NODENAME_MAX_LENGTH];		//节点名称
	int8		 val[NODEVALUE_MAX_LENGTH];		//节点内容
}XMLNode;

///////////////////////////////////////////////////////////////////////////
//构建部分
//////////////////////////////////////////////////////////////////////////
 

//函数功能: 保存xml文档到字符串
//str - 生成的字符串
//length str缓冲区的长度
//返回值：生成的字符串长度，失败返回-1
int32 xml_saveString(char * str, int32 length);

//函数功能: 创建新的xml文档
S_XMLItem * xml_new();

//函数功能: 释放节点内存
void xml_free();

/**********************************************************************************
函数功能: 添加节点
	Item -- 夫节点
	name -- 节点名
	value -- 节点值
返回值： -1 -- 失败， 0 -- 成功
**********************************************************************************/
S_XMLItem *  xml_AddItem(S_XMLItem * Item,char * name, const char * value);

/**********************************************************************************
函数功能: 生成新节点
	Item -- 夫节点
	name -- 节点名
	value -- 节点值
返回值： -1 -- 失败， 0 -- 成功
**********************************************************************************/
S_XMLItem *  xml_NewItem(S_XMLItem * Item,char * name, char * value);

/**********************************************************************************
函数功能: 附加节点到指定父节点
	root -- 夫节点
	item -- 节点名
返回值： -1 -- 失败， 0 -- 成功
**********************************************************************************/
int32  xml_AppendItem(S_XMLItem * root, S_XMLItem * item);

//函数功能: 删除节点
//	Item -- 夫节点
//返回值： -1 -- 失败， 0 -- 成功
int32  xml_DelItem(S_XMLItem * Item);




///////////////////////////////////////////////////////////////////////////
//解析部分
//////////////////////////////////////////////////////////////////////////


//函数功能		从XML字符串中找指定结点，并返回该结点的值
//string		[in]XML字符串
//BufferLength	[in]XML字符串的长度
//item			[in]结点，表示方法如"xml/item1/item2"，一定要从根结点开始写，最后一个是叶
//result		[out]找到的结点的值
//返回值		1找到结点，0未找到结点
int32 xml_FindValue(const char *string, int BufferLength, const char *item, char *result);

//函数功能：	遍历XML文件中的值，从第一个直到最后
//XMLStr		[in]要遍历的XML文件，不为NULL时从头遍历，为NULL时表示接着上一次的遍历
//len			[in]XML文件的长度，XMLStr不为NULL时有意义，为NULL时忽略该值
//name			[out]遍历到的结点名字，这应该是从根结点开始
//value			[out]遍历到的结点值
//返回值：		为1时表示遍历到了结点；为0时表示没有遍历到结点，也就表示该XML文件遍历结束
int32	xml_SpreadValue(const char *XMLStr, int len, char *name, char *value);
#ifdef __cplusplus
}
#endif
#endif
